1T_Pandas 의 자료형 - Series, DataFrame

오늘의 과정

  • Pandas
    • => 데이터 입력 ( 우리가 직접 수작업, 엑셀, CSV, DB )
    • => 데이터 출력 ( print, csv, excel, ... db )
    • => 데이터 전처리 ( preprocess => 우리가 수집한/크롤링한 정보를 분석 가능한 형태로 만들어주는 작업 )
    • => 조금 더 복잡한, => 크롤링 ( AJAX POST , select option )

In [1]:
import pandas as pd  # 관례적으로, pandas 를 pd라는 이름으로 import 한다.
  • Numpy => 수학적인 연산; Number, Matrix ( C ) => Matlab ( low-level )
  • Pandas => 데이터 분석; ( Pandas를 설치하기 위해서 Numpy 가 필요합니다. ) ( high-level )(내부적으로 Numpy가 쓰여 계산이 된다.)
  • scipy => 수학계산; 과학적인 계산...
  • scikit-learn => 미리 머신러닝 알고리즘이 구현되어 있는 라이브러리
  • tensorflow => 미리 머신러닝/딥러닝 알고리즘이 구현되어 있는 라이브러리
  • scikit-learn, tensorflow 이 데이터를 => pandas ( 머신러닝 X; 데이터 분석 )
  • 파이썬 배울 때 순서

      1. Zen of Python ( PEP0020 )
      1. PEP0008 ( Pythonic한 방법 )
      1. 자료형
  • Pandas 배울 때 순서 => Pandas스러운 방법으로 개발

    • Pandas 자료형 ( DF; DataFrame )
      1. Series, 2. DataFrame

In [2]:
# Matrix ( 2차원 행렬; Column x Row )
pd.DataFrame()


Out[2]:

In [3]:
# List, = Row나 Column 그 자체
pd.Series()


Out[3]:
Series([], dtype: float64)

In [5]:
animals = ["dog", "cat", "iguana"]
animals


Out[5]:
['dog', 'cat', 'iguana']

In [6]:
len(animals)


Out[6]:
3

In [7]:
animals_series = pd.Series(["dog", "cat", "iguana"])

In [8]:
animals_series


Out[8]:
0       dog
1       cat
2    iguana
dtype: object

In [9]:
len(animals_series)


Out[9]:
3

Series & DataFrame 의 관계


In [17]:
name_series = pd.Series(["김기표", "고기표", "이기표"])
# List <=> Series, 하지만 여러분은 가능하면 Series 만 사용하자.

In [18]:
name_series[0:2]


Out[18]:
0    김기표
1    고기표
dtype: object

In [19]:
list(name_series)


Out[19]:
['김기표', '고기표', '이기표']

In [20]:
email_series = pd.Series(["kimkipoy@gmail.com", "kkp@naver.com", "kp@hanmail.net"])

In [21]:
name_series


Out[21]:
0    김기표
1    고기표
2    이기표
dtype: object

In [22]:
email_series


Out[22]:
0    kimkipoy@gmail.com
1         kkp@naver.com
2        kp@hanmail.net
dtype: object

In [23]:
type(email_series)


Out[23]:
pandas.core.series.Series

In [24]:
# Column => Name, Email
df = pd.DataFrame({"Name": name_series, "Email": email_series})
df


Out[24]:
Email Name
0 kimkipoy@gmail.com 김기표
1 kkp@naver.com 고기표
2 kp@hanmail.net 이기표

In [25]:
# Column 을 기준으로 ( 지금은 하나의 Column 이 하나의 Series ) => Series 라고 보고 있다.

In [26]:
df.loc[0]   # Row 를 Series 로 보고 있다.


Out[26]:
Email    kimkipoy@gmail.com
Name                    김기표
Name: 0, dtype: object

In [27]:
type(df.loc[0])


Out[27]:
pandas.core.series.Series

In [28]:
# DataFrame 에서 Column 을 가져오는 방법
df["Name"]


Out[28]:
0    김기표
1    고기표
2    이기표
Name: Name, dtype: object

In [30]:
df.Name   #이렇게 써도 되긴 한데 함수랑 헷갈려. 기호에 따라 쓰자


Out[30]:
0    김기표
1    고기표
2    이기표
Name: Name, dtype: object

In [31]:
df2 = pd.DataFrame(columns=["나는 최고다"])

In [32]:
df2


Out[32]:
나는 최고다

In [33]:
df2["나는 최고다"]


Out[33]:
Series([], Name: 나는 최고다, dtype: object)

In [34]:
df2.나는 최고다


  File "<ipython-input-34-a0cce63cdab8>", line 1
    df2.나는 최고다
             ^
SyntaxError: invalid syntax

In [35]:
df2 = pd.DataFrame(columns=["우리는_최고다"])

In [36]:
df2.우리는_최고다


Out[36]:
Series([], Name: 우리는_최고다, dtype: object)
  • 위와 같은 방법은 좋은 게 아니다. 가급적 한글은 빼서 쓰자.
    • 헤더에서는 영어를 쓰는 것이 좋다. 한글은 깨지기도 하고 문제가 생길 수 있다.
    • Python2에서 깨질 수 있다.

-

-시리즈의 기능으로 각각 채워 넣어진다.


In [38]:
# DataFrame 에서 Row 를 가져오는 방법
df.loc[0]   #loc = location의 약자


Out[38]:
Email    kimkipoy@gmail.com
Name                    김기표
Name: 0, dtype: object

In [39]:
df.Name[0]
#이것과 loc가 다른 것은? 리스트인데 딕셔너리처럼 동작도 가능한 리스트다.


Out[39]:
'김기표'

In [40]:
df.loc[2]["Email"]


Out[40]:
'kp@hanmail.net'

In [41]:
df.Name   #index로 나오게 되고


Out[41]:
0    김기표
1    고기표
2    이기표
Name: Name, dtype: object

In [42]:
df.loc[2]   #column 이름으로 나오게 된다.


Out[42]:
Email    kp@hanmail.net
Name                이기표
Name: 2, dtype: object

Pandas 에서 데이터 추가하기 ( 2 ) ( Series 로 하는거 말고, 우리가 직접 입력하는 경우 )


In [43]:
df = pd.DataFrame(columns=["Name", "Email"])

In [55]:
df.loc[0] = ["김기표", "kkp@gmail.com"]   # 데이터 추가하기 (1)

In [49]:
df.loc[0]


Out[49]:
Name               김기표
Email    kkp@gmail.com
Name: 0, dtype: object

In [45]:
df


Out[45]:
Name Email
0 김기표 kkp@gmail.com

In [50]:
# 이것을 정확히 쓰기 위해서는 Column의 정확한 "순서"를 알고 있어야 합니다.
df.loc[0] = ["kkp@gmail.com", '김기표']
df


Out[50]:
Name Email
0 kkp@gmail.com 김기표

In [57]:
#좋은 입력 방식. 딕셔너리 방식으로 넣으면 된다.
df.loc[1] = {"Name": "강기표", "Email": "kkp@naver.com"}
df


Out[57]:
Name Email Address
0 김기표 kkp@gmail.com
1 강기표 kkp@naver.com NaN

In [52]:
#데이터의 Row를 추가하는 방법에 대해서 다룸
#데이터 Column을 추가하려면?

In [71]:
df["Address"] = ""
df


Out[71]:
Name Email Address
0 김기표 kkp@gmail.com
1 강기표 kkp@naver.com

In [59]:
# Address => "대기빌딩 지하2층 교무실 ____ 앞"
# 최대한 다양한 방법으로 해보시면 됩니다. ( 3가지+ )

In [74]:
# 1. for 문으로 시작하자. df.loc[____]

for i in range(len(df)):
    name = df.loc[i]["Name"]  #이름을 뽑았어요.
    df.loc[i]["Address"] = "대기빌딩 지하2층 교무실 " + name + " 앞"
    # + => 더하는 방법
    # %s => 문자열 치환
    # {name} => 문자열 치환 ( formatting )

In [75]:
df


Out[75]:
Name Email Address
0 김기표 kkp@gmail.com 대기빌딩 지하2층 교무실 김기표 앞
1 강기표 kkp@naver.com 대기빌딩 지하2층 교무실 강기표 앞

In [80]:
# 2. for 문을 돌린다. ( 쉽게 돌리는 방식 )
# 제가 잘 몰랐어요. 없는 거고 이거 까먹으시면 됩니다.

for index, row in df.iteritems():
#     df.loc[index]["Address"] = "대기빌딩 지하2층 교무실 " + df.loc[index]["Name"] + " 앞"
    print(index)  #for문을 안 도는 이유는 index가 아니고 column이 나온다.
# df


Name
Email
Address

In [81]:
df["Address"] = ""

In [82]:
df


Out[82]:
Name Email Address
0 김기표 kkp@gmail.com
1 강기표 kkp@naver.com

In [83]:
df["Address"] = "대기빌딩 지하 2층 교무실 " + df["Name"] + " 앞"
df
#왜 되는지 모르겠다. 그냥 되는 거다.


Out[83]:
Name Email Address
0 김기표 kkp@gmail.com 대기빌딩 지하 2층 교무실 김기표 앞
1 강기표 kkp@naver.com 대기빌딩 지하 2층 교무실 강기표 앞

In [84]:
df["Name"]   #Series가 뽑힌다. Series의 기능? 연산이 가능하다.


Out[84]:
0    김기표
1    강기표
Name: Name, dtype: object

In [86]:
df["Name"] + " 앞"   #이렇게 Series로 자동 연산이 쭉 된다.


Out[86]:
0    김기표 앞
1    강기표 앞
Name: Name, dtype: object

In [87]:
# 함수형 프로그래밍을 이용하자.
df["Address"] = ""
df


Out[87]:
Name Email Address
0 김기표 kkp@gmail.com
1 강기표 kkp@naver.com

In [88]:
def get_address(name):
    return "대기빌딩 지하 2층 교무실 " + name + " 앞"

In [89]:
get_address("김기표")


Out[89]:
'대기빌딩 지하 2층 교무실 김기표 앞'

In [91]:
df["Name"].apply(get_address)


Out[91]:
0    대기빌딩 지하 2층 교무실 김기표 앞
1    대기빌딩 지하 2층 교무실 강기표 앞
Name: Name, dtype: object

In [92]:
df


Out[92]:
Name Email Address
0 김기표 kkp@gmail.com
1 강기표 kkp@naver.com

In [94]:
df["Address"] = df["Name"].apply(lambda name: "대기빌딩 지하 2층 " + name + " 앞")

In [95]:
df


Out[95]:
Name Email Address
0 김기표 kkp@gmail.com 대기빌딩 지하 2층 김기표 앞
1 강기표 kkp@naver.com 대기빌딩 지하 2층 강기표 앞

In [ ]: